package com.smasher.widget.edit;

import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;
import android.util.Log;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by  林师金 on 2019/4/17 0017.
 */

public class CashierInputFilter implements InputFilter {
    Pattern mPattern;

    // 输入的最大金额
    private static final double MAX_VALUE = Double.MAX_VALUE;
    // 小数点后的位数
    private static final int POINTER_LENGTH = 2;

    private static final String POINTER = ".";
    private static final String TAG = "Cashier";

    public CashierInputFilter() {
        // 优化后的正则表达式，确保至少有一个数字，并且小数点后最多两位
        mPattern = Pattern.compile("^\\d+(\\.\\d{0,2})?$");
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        // 获取用户输入的文本 sourceText 和当前文本 destText
        String sourceText = source.toString();
        String destText = dest.toString();

        // 验证删除等按键
        if (TextUtils.isEmpty(sourceText)) {
            return null; // 返回null以正确处理删除操作，表示接受输入
        }

        // 验证输入格式
        String newText = destText.substring(0, dstart) + sourceText + destText.substring(dend);
        Matcher matcher = mPattern.matcher(newText);
        if (!matcher.matches()) {
            return ""; // 返回空字符串表示输入格式不正确，拒绝输入
        }

        // 验证小数点精度
        if (newText.contains(POINTER)) {
            int index = newText.indexOf(POINTER);
            int length = newText.length() - index - 1;
            if (length > POINTER_LENGTH) {
                return ""; // 返回空字符串表示小数点后位数超出限制，拒绝输入
            }
        }

        // 验证输入金额的大小
        try {
            double sumText = Double.parseDouble(newText);
            if (sumText > MAX_VALUE) {
                return ""; // 返回空字符串表示金额超出最大值，拒绝输入
            }
        } catch (NumberFormatException e) {
            // 添加日志记录或返回更具体的错误信息
            Log.e(TAG, "filter: ", e); // 添加日志记录
            return ""; // 返回空字符串表示金额格式不正确，拒绝输入
        }
        return null; // 返回null表示接受输入
    }
}